//
// Created by QU on 24-6-13.
//
#include <iostream>
#include <fstream>
#include <sstream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>

#include <random>

using std::cout, std::cin, std::endl, std::unitbuf;

int main(int argc, char const *argv[]) {
    // random是c++的随机数函数库
    // random通过定义一组协同工作的类, 来解决随机数问题:
    // 1. 随机数引擎                 生成随机unsigned 整数序列
    // 2. 随机数分布类                使用引擎返回服从特定概率分布的随机数

    // 在c++中有很多随机数生成引擎, 他们通常需要一个种子用来生成不同的随机数序列, 否则他们生成的数据数的值是相同的.
    // https://zh.cppreference.com/w/cpp/numeric/random

    // 我们使用就用default_random_engine就可以了
    // 注意: 如果在函数中使用, 请加上static, 否则每次调用函数生成的'随机数'将会是同一个值.
    // static std::default_random_engine engine;
    static std::default_random_engine engine(time(nullptr));
    // 如果engine没有种子, 你会发现产生的随机数永远是相同的.

    // 如果有硬件实现源的, 可以使用random_device
    // 注意: 如果在函数中使用, 请加上static, 否则每次调用函数生成的'随机数'将会是同一个值.
    static std::random_device random_device;

    // 在[0,10] 这11个int中生成  均匀分布.
    static std::uniform_int_distribution<int> uniform_int_distribution(0,10);

    for (int i = 0; i < 10; ++i)
    {
        cout << uniform_int_distribution(random_device) << " ";
    }
    cout << endl;

    for (int i = 0; i < 10; ++i)
    {
        cout << uniform_int_distribution(engine) << " ";
    }
    cout << endl;

    // 当然也有好多种分布可以使用.
    return 0;
}